package study.datastructure.order.sort;

public class MergeSort {
    // 归并排序的主方法
    public void mergeSort(int[] array, int left, int right) {
        if (left < right) {
            int mid = (left + right) / 2;

            // 递归排序两个子数组
            mergeSort(array, left, mid);
            mergeSort(array, mid + 1, right);

            // 合并两个子数组
            merge(array, left, mid, right);
        }
    }

    // 合并两个有序子数组的方法
    void merge(int[] array, int left, int mid, int right) {
        // 计算两个子数组的长度
        int n1 = mid - left + 1;
        int n2 = right - mid;

        // 创建临时数组
        int[] L = new int[n1];
        int[] R = new int[n2];

        // 将数据复制到临时数组
        System.arraycopy(array, left, L, 0, n1);
        System.arraycopy(array, mid + 1, R, 0, n2);

        // 合并临时数组到原数组
        int i = 0, j = 0;
        int k = left;
        while (i < n1 && j < n2) {
            if (L[i] <= R[j]) {
                array[k] = L[i];
                i++;
            } else {
                array[k] = R[j];
                j++;
            }
            k++;
        }

        // 复制剩余的元素
        while (i < n1) {
            array[k] = L[i];
            i++;
            k++;
        }

        while (j < n2) {
            array[k] = R[j];
            j++;
            k++;
        }
    }

    public static void main(String[] args) {
        MergeSort sorter = new MergeSort();
        int[] array = {12, 11, 13, 5, 6, 7};
        sorter.mergeSort(array, 0, array.length - 1);
        System.out.println("Sorted array is:");
        for (int value : array) {
            System.out.print(value + " ");
        }
    }
}
